def__iter__(self): """ 每次返回文件内容,并将数据存到队列中 :return: """ for index, value in enumerate(self.file, 1): self.history.append((index, value)) yield value
if __name__ == '__main__': with open("envs.py", encoding="utf-8") as f: content = linehistory(f) # 迭代文件,如果文件文件中包含 SECRET_KEY,那么就打印前三行信息 for c in content: if"SECRET_KEY"in c: print(content.history)
迭代器切片
标准的切片不能对迭代器进行切片,可以使用 itertools 中的 islice 方法
1 2 3 4 5 6 7 8 9 10 11
defcount(n): whileTrue: yield n n += 1
a = count(0) # a[10:20] # 报错
from itertools import islice for x in islice(a, 10, 20): print(x) # 10...19
# 并不是丢弃小于 30 的元素,而是丢失函数中返回第一个 false 之前的元素,然后返回后面的所有元素。 # 此功能在去除文件开头的某些注释,而不想去除代码中的注释有帮助 for z in dropwhile(lambda x: not x > 30, a): print(z) # 34,12,15,16,17,10,99,100
知道了要跳过的元素的序号的话,那么可以使用 itertools.islice() 来代替
1 2 3 4 5 6 7
a = [1,2,3,11,20,34,12,15,16,17,10,99,100]
from itertools import islice
# (a, 3, None) 相当于 a[3:]。同理,(a, None, 3) 相当于 a[:3] for x in islice(a, 3, None): print(x) # 11,20,34,12,15,16,17,10,99,100
排列组合
permutations
1 2 3 4 5 6 7 8 9 10 11 12 13 14
item = ["a", "b", "c"]
from itertools import permutations # 同一个元素不允许重复出现 for x in permutations(item): print(x) """ ('a', 'b', 'c') ('a', 'c', 'b') ('b', 'a', 'c') ('b', 'c', 'a') ('c', 'a', 'b') ('c', 'b', 'a') """
还可以指定元素的个数,例如 permutations(item, 2)
zip_longest, zip
zip 可以同时迭代多个序列,每次分别从一个序列中取一个元素。zip 一旦其中某个序列到底结尾,迭代宣告结束,因此迭代长度跟参数中最短序列长度一致。 而 zip_longest 则不会